# Python 将列表用作栈的实现

# 栈是一种线性数据结构，其特点是只能在一端进行插入和删除操作，另一端是栈顶。
# 栈是一种后进先出（LIFO, Last-In-First-Out）数据结构，意味着最后添加的元素最先被移除
# 栈的操作有两种：入栈和出栈。入栈是指在栈顶插入一个元素，出栈是指删除栈顶元素。
# 栈的应用很多，比如函数调用栈、表达式求值、浏览器的前进后退、撤销操作、括号匹配、迷宫寻路等。


# 栈的操作
# 1. 入栈 push(item): 将元素 item 加入栈顶
# 2. 出栈 pop(): 删除栈顶元素，并返回该元素的值
# 3. 栈顶 peek(): 返回栈顶元素的值，但不删除
# 4. 栈是否为空 isEmpty(): 判断栈是否为空
# 5. 栈的大小 size(): 返回栈的大小

# 创建一个空栈
stack = []

# 入栈
stack.append(1)
stack.append(2)
stack.append(3)

# 出栈, 最后入栈的元素被弹出
print(stack.pop())  # 3

# 栈顶元素
print(stack[-1])  # 1

# 栈是否为空
print(stack == [] or len(stack) == 0)  # False

# 栈的大小
print(len(stack))  # 2


# 栈的实现示例：
class Stack:
    def __init__(self):                 # 构造函数初始化一个空栈
        self.stack = []

    def push(self, value):              # 定义入栈函数
        self.stack.append(value)

    def pop(self):                      # 定义出栈函数
        if self.is_empty():
            return None
        return self.stack.pop()

    def peek(self):                     # 定义栈顶函数
        if self.is_empty():
            return None
        return self.stack[-1]

    def is_empty(self):                 # 定义判断栈是否为空函数
        return len(self.stack) == 0

    def size(self):                     # 定义栈的大小函数
        return len(self.stack)

# 使用示例
stack = Stack()
stack.push(100)
stack.push(200)
stack.push(300)
print("栈顶的元素:", stack.peek())
print("栈是否为空:", stack.is_empty())
print("栈大小:", stack.size())
print("弹出栈顶元素:", stack.pop())  # 3
print("弹出后栈大小:", stack.size())




